﻿#pragma once
#include <iostream>
#include <fstream>
#include <mutex>
#include <cstdarg>
#include <ctime>

// 日志级别枚举
enum class LogLevel:int {
    LOG_LEVEL_DEBUG,
    LOG_LEVEL_INFO,
    LOG_LEVEL_WARNING,
    LOG_LEVEL_ERROR,
};

#ifdef MENGYU_SERVER_LOG

// 日志宏定义（方便调用）
#define LOG_DEBUG(format, ...)   LogTool::getInstance()->log(LogLevel::LOG_LEVEL_DEBUG,  format, ##__VA_ARGS__)
#define LOG_INFO(format, ...)    LogTool::getInstance()->log(LogLevel::LOG_LEVEL_INFO,   format, ##__VA_ARGS__)
#define LOG_WARNING(format, ...) LogTool::getInstance()->log(LogLevel::LOG_LEVEL_WARNING,format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...)   LogTool::getInstance()->log(LogLevel::LOG_LEVEL_ERROR,  format, ##__VA_ARGS__)

class LogTool
{
private:
    std::ofstream _logFile;
    std::mutex _logMutex;
    LogLevel _currentLevel;
    static LogTool* _instance;
    
    // 私有构造函数
    LogTool();

public:
    // 单例模式获取实例
    static LogTool* getInstance();
    ~LogTool();

    // 设置日志级别, 末尾一定要加/
    void init(const std::string &path, LogLevel level = LogLevel::LOG_LEVEL_DEBUG);

    // 日志记录核心方法
    void log(LogLevel level, const char* format, ...);
};

#else
#define LOG_DEBUG(format, ...)
#define LOG_INFO(format, ...)  
#define LOG_WARNING(format, ...) 
#define LOG_ERROR(format, ...)  
#endif
